#include <iostream>
#include <vector>
#include <string>
#include <math.h>
#include <unordered_set>

using namespace std;

class Solution
{
public:
    int decode(int n, vector<int> &nums)
    {
        while (n != 0)
        {
            nums.push_back(n % 10);
            n = n / 10;
        }
        return nums.size();
    }

    bool isHappy(int n)
    {
        vector<int> nums;
        // 用set存放出现过的数，如果重复出现就说明进入无限循环了
        unordered_set<int> set;
        while (1)
        {
            decode(n, nums);
            n = 0;
            while (!nums.empty())
            {
                n += pow(nums.back(), 2);
                nums.pop_back();
            }
            if (n == 1)
                return true;
            if (set.find(n) != set.end())
                return false;
            set.insert(n);
        }
        return 0;
    }

    // 取数值各个位上的单数之和
    int getSum(int n)
    {
        int sum = 0;
        while (n)
        {
            sum += (n % 10) * (n % 10);
            n /= 10;
        }
        return sum;
    }
    bool isHappyAns(int n)
    {
        unordered_set<int> set;
        while (1)
        {
            int sum = getSum(n);
            if (sum == 1)
            {
                return true;
            }
            // 如果这个sum曾经出现过，说明已经陷入了无限循环了，立刻return false
            if (set.find(sum) != set.end())
            {
                return false;
            }
            else
            {
                set.insert(sum);
            }
            n = sum;
        }
    }
};

int main()
{
    int n = 7;
    Solution s;
    cout << s.isHappy(n) << endl;
    return 0;
}
